gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinHyperLink.cpp
#include "stdafx.h" #include "Resource.h" #include "SkinHyperLink.h" ////////////////////////////////////////////////////////////////////////// //提示 ID #define TOOLTIP_ID 100 #define DEF_HOVERTEXT_COLOR RGB(255,0,255) #define DEF_VISITEDTEXT_COLOR RGB(0,0,100) #define DEF_NORMALTEXT_COLOR RGB(0,0,230) ////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CSkinHyperLink, CStatic) BEGIN_MESSAGE_MAP(CSkinHyperLink, CStatic) ON_WM_PAINT() ON_WM_CREATE() ON_WM_SETCURSOR() ON_WM_MOUSEMOVE() ON_WM_CTLCOLOR_REFLECT() ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) ON_MESSAGE(WM_SETTEXT,OnSetTextMesage) ON_CONTROL_REFLECT(STN_CLICKED, OnStnClicked) END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// //构造函数 CSkinHyperLink::CSkinHyperLink() { m_bVisited=false; m_bHovering=false; m_bUnderline=true; m_bAutoAdjust=true; m_crBack = RGB(255,255,255); } //析构函数 CSkinHyperLink::~CSkinHyperLink() { } //消息解释 BOOL CSkinHyperLink::PreTranslateMessage(MSG * pMsg) { m_ToolTip.RelayEvent(pMsg); return CStatic::PreTranslateMessage(pMsg); } HBRUSH CSkinHyperLink::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH); } //控件子类化 void CSkinHyperLink::PreSubclassWindow() { __super::PreSubclassWindow(); //初始化 InitHyperLink(); return; } //建立消息 int CSkinHyperLink::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct)==-1) return -1; //初始化 InitHyperLink(); return 0; } //绘画消息 void CSkinHyperLink::OnPaint() { CPaintDC dc(this); //获取位置 CRect ClientRect; GetClientRect(&ClientRect); //设置 DC dc.SetBkMode(TRANSPARENT); dc.FillSolidRect(&ClientRect, m_crBack); CFont font; font.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("宋体")); dc.SelectObject(&font); if (m_bHovering) dc.SetTextColor(DEF_HOVERTEXT_COLOR); else if (m_bVisited) dc.SetTextColor(DEF_VISITEDTEXT_COLOR); else dc.SetTextColor(DEF_NORMALTEXT_COLOR); //绘画字体 CString strText; GetWindowText(strText); LONG dwStyte=GetWindowLong(m_hWnd,GWL_STYLE); UINT uFormat=DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS; if (dwStyte&SS_RIGHT) uFormat|=DT_RIGHT; else if (dwStyte&SS_CENTER) uFormat|=DT_CENTER; else uFormat|=DT_LEFT; dc.DrawText(strText,&ClientRect,uFormat); return; } //光标消息 BOOL CSkinHyperLink::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message) { ::SetCursor(GetSysHandCursor()); return TRUE; } //单击控件 void CSkinHyperLink::OnStnClicked() { //判断状态 if ((m_strURL.IsEmpty())) return; //打开网页 ShellExecute(NULL,TEXT("open"),m_strURL,NULL,NULL,SW_SHOW); //重画控件 if (m_bVisited==false) { m_bVisited=true; Invalidate(); } return; } //鼠标移动消息 void CSkinHyperLink::OnMouseMove(UINT nFlags, CPoint point) { if (m_bHovering==false) { //注册消息 m_bHovering=true; Invalidate(); TRACKMOUSEEVENT TrackMouseEvent; TrackMouseEvent.cbSize=sizeof(TrackMouseEvent); TrackMouseEvent.dwFlags=TME_LEAVE; TrackMouseEvent.hwndTrack=GetSafeHwnd(); TrackMouseEvent.dwHoverTime=HOVER_DEFAULT; _TrackMouseEvent(&TrackMouseEvent); } __super::OnMouseMove(nFlags, point); } //鼠标离开消息 LRESULT CSkinHyperLink::OnMouseLeave(WPARAM wparam, LPARAM lparam) { m_bHovering=false; Invalidate(); return 0; } //标题消息 LRESULT CSkinHyperLink::OnSetTextMesage(WPARAM wParam, LPARAM lParam) { LRESULT lResult=Default(); if (m_bAutoAdjust) AdjustHyperLink(); return lResult; } //设置访问 void CSkinHyperLink::SetVisited(bool bVisited) { if (m_bVisited!=bVisited) { m_bVisited=bVisited; if (GetSafeHwnd()) Invalidate(); } return; } //设置下划线 void CSkinHyperLink::SetUnderline(bool bUnderline) { if (m_bUnderline!=bUnderline) { m_bUnderline=bUnderline; if (GetSafeHwnd()) Invalidate(); } return; } //设置 URL void CSkinHyperLink::SetHyperLinkUrl(LPCTSTR pszUrl) { //设置变量 m_strURL=pszUrl; //建立提示 UpdateToolTip(); return; } //设置调整 void CSkinHyperLink::SetAutoAdjust(bool bAutoAdjust) { if (m_bAutoAdjust!=bAutoAdjust) { m_bAutoAdjust=bAutoAdjust; if (m_bAutoAdjust) AdjustHyperLink(); } return; } //初始化 void CSkinHyperLink::InitHyperLink() { SetWindowLong(m_hWnd,GWL_STYLE,GetStyle()|SS_NOTIFY); //ModifyStyleEx(0, WS_EX_TRANSPARENT); if (m_bAutoAdjust) AdjustHyperLink(); UpdateToolTip(); return; } //更新提示 void CSkinHyperLink::UpdateToolTip() { if (GetSafeHwnd()) { if (m_ToolTip.GetSafeHwnd()==NULL) m_ToolTip.Create(this); if (m_strURL.IsEmpty()==false) { CRect ClientRect; GetClientRect(&ClientRect); m_ToolTip.Activate(TRUE); m_ToolTip.AddTool(this,m_strURL,&ClientRect,TOOLTIP_ID); } else m_ToolTip.Activate(FALSE); } return; } //调整位置 void CSkinHyperLink::AdjustHyperLink() { //获取标题 CString strText; GetWindowText(strText); //获取位置 CRect ControlRect; GetWindowRect(&ControlRect); GetParent()->ScreenToClient(&ControlRect); //计算长度 CDC * pDC=GetDC(); CSize Size=pDC->GetTextExtent(strText); ReleaseDC(pDC); //移动位置 MoveWindow(ControlRect.left,ControlRect.top,Size.cx,Size.cy); return; } //////////////////////////////////////////////////////////////////////////